package com.ftx.controller.test.annotation.autowire;

import com.ftx.controller.test.annotation.value.MainConfigPropertyValues;
import com.ftx.controller.test.annotation.value.Person;
import org.junit.Test;
import org.springframework.context.annotation.*;

/**
 * Created by fengtingxin on 2020/4/22.
 *
 * 自动装配：
 *      spring利用依赖注入（DI），完成对IOC容器中各个组件的依赖关系赋值
 *
 *  1.@Autowired注解
 *      1.默认优先按照类型去容器中找对应的组件：  applicationContext.getBean(BookService.class);
 *      2).@Qualifier 指定装配的bean的name
 *      3).@Autowired(required = false) 设置这个bean并不是必须的
 *      4).@Primary 在spring自动装配的时候默认使用首选的bean  这个注解使用在首选的bean上。
 *
 *  2.spring 还支持 @Resource注解 (JSR250) 和 @Inject(JSR330)【java规范的注解】
 *        1.@Resource : 可以实现自动装配功能。 默认是按照组件名称作为组件名称装配的。
 *          没有支持@Primary \没有支持@Autowired(required = false)
 *        2.@Inject 使用需要导入依赖
 *          支持@Primary  不支持@Autowired(required = false)
 *   区别：@Autowired 是spring的，@Resource 和 @Inject是java规范的.
 *
 *   AutowiredAnnotationBeanPostProcessor 解析完成自动装配功能。
 *   @Autowired 可以放在方法，构造器，参数，属性上
 *
 * 3.@Autowired
 *  * 1.把@Autowired放在普通的t方法上，则参数是从容器中获取的，调用的是方法的无参构造器
 *  * 2.把@Autowired 放在构造器上，如果组件只有一个有参构造器，这个有参构造器@Autowire可以省略，参数位置的组件可以自动从容器中获取
 *  * 3.放在参数位置
 *  4.自定义组件想要使用spring容器底层的一些组件，(ApplicationContext,BeanFactory....)
 *      自定义实现xxxAware,在创建对象的时候，会调用接口规定的方法注入相关组件；
 *     //吧spring底层一些组件注入到自定义的bean中
 *
 *     xxxAware 都是使用 xxxAwareProcessor 来处理的。
 *
 *     ApplicationContextAware  --> ApplicationContextAwareProcessor
 *
 *
 *
 */


@Configuration
@ComponentScan({"com.ftx.controller.test.annotation.autowire"})
public class MainConfigofAutowired {


    @Primary
    @Bean("bookDao2")
    public BookDao getBook(){
        BookDao bookDao = new BookDao();
        bookDao.setLable("2");
        return bookDao;
    }
}
